<?php

function nvl($value, $default) {
	return isset($value) ? $value : $default;
}





/** 
 * Copy file or folder from source to destination, it can do 
 * recursive copy as well and is very smart 
 * It recursively creates the dest file or directory path if there weren't exists 
 * Situtaions : 
 * - Src:/home/test/file.txt ,Dst:/home/test/b ,Result:/home/test/b -> If source was file copy file.txt name with b as name to destination 
 * - Src:/home/test/file.txt ,Dst:/home/test/b/ ,Result:/home/test/b/file.txt -> If source was file Creates b directory if does not exsits and copy file.txt into it 
 * - Src:/home/test ,Dst:/home/ ,Result:/home/test/** -> If source was directory copy test directory and all of its content into dest      
 * - Src:/home/test/ ,Dst:/home/ ,Result:/home/**-> if source was direcotry copy its content to dest 
 * - Src:/home/test ,Dst:/home/test2 ,Result:/home/test2/** -> if source was directoy copy it and its content to dest with test2 as name 
 * - Src:/home/test/ ,Dst:/home/test2 ,Result:->/home/test2/** if source was directoy copy it and its content to dest with test2 as name 
 * @todo 
 *     - Should have rollback technique so it can undo the copy when it wasn't successful 
 *  - Auto destination technique should be possible to turn off 
 *  - Supporting callback function 
 *  - May prevent some issues on shared enviroments : http://us3.php.net/umask 
 * @param $source //file or folder 
 * @param $dest ///file or folder 
 * @param $options //folderPermission,filePermission 
 * @return boolean 
 */
function smartCopy($source, $dest, $options = array (
	'folderPermission' => 0755,
	'filePermission' => 0755
)) {
	$result = false;

	if (is_file($source)) {
		if ($dest[strlen($dest) - 1] == '/') {
			if (!file_exists($dest)) {
				cmfcDirectory::makeAll($dest, $options['folderPermission'], true);
			}
			$__dest = $dest . "/" . basename($source);
		} else {
			$__dest = $dest;
		}
		$result = copy($source, $__dest);
		chmod($__dest, $options['filePermission']);

	}
	elseif (is_dir($source)) {
		if ($dest[strlen($dest) - 1] == '/') {
			if ($source[strlen($source) - 1] == '/') {
				//Copy only contents 
			} else {
				//Change parent itself and its contents 
				$dest = $dest . basename($source);
				@ mkdir($dest);
				chmod($dest, $options['filePermission']);
			}
		} else {
			if ($source[strlen($source) - 1] == '/') {
				//Copy parent directory with new name and all its content 
				@ mkdir($dest, $options['folderPermission']);
				chmod($dest, $options['filePermission']);
			} else {
				//Copy parent directory with new name and all its content 
				@ mkdir($dest, $options['folderPermission']);
				chmod($dest, $options['filePermission']);
			}
		}

		$dirHandle = opendir($source);
		while ($file = readdir($dirHandle)) {
			if ($file != "." && $file != "..") {
				if (!is_dir($source . "/" . $file)) {
					$__dest = $dest . "/" . $file;
				} else {
					$__dest = $dest . "/" . $file;
				}
				//echo "$source/$file ||| $__dest<br />"; 
				$result = smartCopy($source . "/" . $file, $__dest, $options);
			}
		}
		closedir($dirHandle);

	} else {
		$result = false;
	}
	return $result;
}


